﻿using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Security.Cryptography;
using System.Text;
using System.Threading.Tasks;

namespace Tools
{
	public  class TypeDesToken
	{

		//默认密钥向量
		private byte[] Keys = { 0xEF, 0xAB, 0x56, 0x78, 0x90, 0x34, 0xCD, 0x12 };
		/// <summary>
		/// DES加密字符串
		/// </summary>
		/// <param name="encryptString">待加密的字符串</param>
		/// <param name="encryptKey">加密密钥,要求为8位</param>
		/// <returns>加密成功返回加密后的字符串，失败返回源串</returns>
		public string EncryptDES(string encryptString, string encryptKey)
		{

			byte[] rgbKey = Encoding.UTF8.GetBytes(encryptKey.Substring(0, 8));
			byte[] rgbIV = Keys;
			byte[] inputByteArray = Encoding.UTF8.GetBytes(encryptString);
			DESCryptoServiceProvider dCSP = new DESCryptoServiceProvider();
			MemoryStream mStream = new MemoryStream();
			CryptoStream cStream = new CryptoStream(mStream, dCSP.CreateEncryptor(rgbKey, rgbIV), CryptoStreamMode.Write);
			cStream.Write(inputByteArray, 0, inputByteArray.Length);
			cStream.FlushFinalBlock();
			return Convert.ToBase64String(mStream.ToArray());

			//try
			//{
			//	byte[] rgbKey = Encoding.UTF8.GetBytes(encryptKey.Substring(0, 8));
			//	byte[] rgbIV = Keys;
			//	byte[] inputByteArray = Encoding.UTF8.GetBytes(encryptString);
			//	DESCryptoServiceProvider dCSP = new DESCryptoServiceProvider();
			//	MemoryStream mStream = new MemoryStream();
			//	CryptoStream cStream = new CryptoStream(mStream, dCSP.CreateEncryptor(rgbKey, rgbIV), CryptoStreamMode.Write);
			//	cStream.Write(inputByteArray, 0, inputByteArray.Length);
			//	cStream.FlushFinalBlock();
			//	return Convert.ToBase64String(mStream.ToArray());
			//}
			//catch(Exception ex)
			//{
			//	throw ex;
			//	return encryptString;
			//}
		}

		/// <summary>
		/// DES解密字符串
		/// </summary>
		/// <param name="decryptString">待解密的字符串</param>
		/// <param name="decryptKey">解密密钥,要求为8位,和加密密钥相同</param>
		/// <returns>解密成功返回解密后的字符串，失败返源串</returns>
		public string DecryptDES(string decryptString, string decryptKey)
		{
			try
			{
				byte[] rgbKey = Encoding.UTF8.GetBytes(decryptKey.Substring(0, 8));
				byte[] rgbIV = Keys;
				byte[] inputByteArray = Convert.FromBase64String(decryptString);
				DESCryptoServiceProvider DCSP = new DESCryptoServiceProvider();
				MemoryStream mStream = new MemoryStream();
				CryptoStream cStream = new CryptoStream(mStream, DCSP.CreateDecryptor(rgbKey, rgbIV), CryptoStreamMode.Write);
				cStream.Write(inputByteArray, 0, inputByteArray.Length);
				cStream.FlushFinalBlock();
				return Encoding.UTF8.GetString(mStream.ToArray());
			}
			catch
			{
				return decryptString;
			}
		}


		public string MakeToken(string uname, string upwd, string Key)
		{
			string NameAndPwd = uname + "|" + upwd;
			return EncryptDES(NameAndPwd, Key);
		}

		public string GetToken(string NameAndPwd, string Key)
		{
			return DecryptDES(NameAndPwd, Key);
		}

		public string FoXiMakeToken(string uname, string upwd)
		{
			return MakeToken(uname, upwd, "20150851");
		}
		public string FoXiGetToken(string NameAndPwd)
		{
			return GetToken(NameAndPwd, "20150851");
		}
	}
}
